# Поведенческий шаблон проектирования ("Шаблоный метод")
# Позволяет определить основу алгоритма, а наследникам переопределять некоторые шаги алгоритма, не изменяя его структуру в целом.

import abc


class Transmitter(metaclass=abc.ABCMeta):
    def _voce_record(self):
        print('Запись фрагмента речи')

    def _simpling(self):
        pass

    def _digitization(self):
        pass

    @abc.abstractmethod
    def _modulation(self):
        pass

    def _transmission(self):
        print('Передача сигнала по радиоканалу')

    def process_start(self):
        self._voce_record()
        self._simpling()
        self._digitization()
        self._modulation()
        self._transmission()


class AnalogTransmitter(Transmitter):
    def _modulation(self):
        print('Модуляция аналогово сигнал')


class DigitTransmitter(Transmitter):
    def _simpling(self):
        print('Дискретизация записанного фрагмента')

    def _digitization(self):
        print('Оцифровка')

    def _modulation(self):
        print('Модуляция цифрового сигнала')


if __name__ == "__main__":
    analog_transmitter = AnalogTransmitter()
    analog_transmitter.process_start()

    print()

    digit_transmitter = DigitTransmitter()
    digit_transmitter.process_start()

    # Запись фрагмента речи
    # Модуляция аналогово сигнал
    # Передача сигнала по радиоканалу

    # Запись фрагмента речи
    # Дискретизация записанного фрагмента
    # Оцифровка
    # Модуляция цифрового сигнала
    # Передача сигнала по радиоканалу
